Software applications, such as web page based applications, mobile device applications, desktop computer system applications, etc., are created by software developers. The software applications are then distributed to end users and run on end user computer systems (e.g., run on a user's personal computer, mobile computing device, served to a user from a web server, etc.). From usage of a software application, a developer may determine that changes to the application are necessary and/or desired for various reasons. For example, a software application may contain a bug causing the application to act in undesirable or unforeseen ways, and may even prevent the software application from running. As another example, a developer may want to change a user interface based on experiences and/or feedback of real world users of the application. As yet another example, a software application may be optimized to run more efficiently in terms of start times, power usage, function execution, etc. There are many other examples of why software applications are updated by software developers.
An update is typically distributed to all end users of the software application after internal testing by the software developer as a software update. However, once an update is installed and executed on the end user computer systems, there may be unforeseen consequences. Similar to the examples above, the update may cause unforeseen bugs in the software application when operating in the real world, may cause a decline in one or more efficiencies of the software application and/or user computer system, may not be received well by end users when actually using the updated software application, as well as other reasons why a developer might be unsatisfied with an update after it is deployed.
Once a software application is installed and/or running on end user computer systems, it may be difficult or impossible to reverse an update with unforeseen real world consequences. Furthermore, testing of the software applications in real world environments is difficult due to the need to distribute the updates to end users while maintaining control over the updates.